package com.appspot.modutajataja;

import java.util.Collections;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TouchGame extends Activity {
	MediaPlayer mediaPlayer; 																// 게임 배경음악
	MediaPlayer gameSoundReadygo;												// 게임효과음 실행 변수
	MediaPlayer gameSoundTok; 														// 게임효과음 실행 변수
	
	Animation ani; 																					// 광고 텍스트 애니메이션 변수
	TextView[] textAd = new TextView[8]; 											// 광고 텍스트 배열
	
	Vector<Integer> cardVector = new Vector<Integer>(); 			// 카드를 랜덤으로 섞기 위한 객체 생성
	Card[] cardArr = new Card[8]; 														// 카드 객체 생성
	LinearLayout card_layout;																// 카드 레이아웃
	int seq = 1; 																							// 카드를 순서대로 뒤집은지 확인하기 위한 키 값 설정

	Timer timerCard = new Timer(); 														// 카드 초기세팅을 위한 타이머
	TextView timer;			 																		// 시간을 표시하는 textView	
	long myBaseTime;		 																		// 타이머를 계산하기 위한 시스템 시간
	long outTime;																						// 계산된 시간을 출력하기 위한 변수

	ImageView gameReady;																	// 게임 준비 이미지 뷰
	ImageView gameStart;																		// 게임 시작 이미지 뷰
	int imageIndex;																					// 게임 준비/시작 이미지 변경을 위한 인덱스
	
	private String userId;
	Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.touch_game);
		
		userId = getIntent().getStringExtra("userId");

		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

		ani = new AlphaAnimation(0.0f, 1.0f);
		ani.setDuration(2000);
		ani.setFillAfter(true);

		shuffle();

		for (int i = 0; i < 8; i++) {
			textAd[i] = (TextView) findViewById(R.id.text_ad1 + i);
			textAd[i].setAnimation(ani);
			textAd[i].startAnimation(ani);
			cardArr[i] = new Card();
			cardArr[i].cardImage = (ImageView) findViewById(R.id.card_touch1 + i);
			cardArr[i].cardImage.setOnClickListener(new CardHandler());
			cardArr[i].faceImage = cardVector.elementAt(i);
			cardArr[i].backImage = R.drawable.event;
			cardArr[i].cardNo = cardVector.elementAt(i) - R.drawable.ad1 + 1;
			cardArr[i].cardImage.setEnabled(false);
		}
		gameReady = (ImageView)findViewById(R.id.game_ready);
		gameStart = (ImageView)findViewById(R.id.game_go);
		
		card_layout = (LinearLayout)findViewById(R.id.touch_card_layout);
		timer = (TextView) findViewById(R.id.timer);
		timer.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/cartoonist.ttf"));

		init();
	} // end of onCreate()

	// card 객체 생성
	class Card {
		ImageView cardImage;
		int faceImage;
		int backImage;
		int cardNo;

		public Card() {
			super();
		}
	} // end of class Card

	// 카드 초기 배치 및 애니메이션을 위한 메소드
	public void init() {
		new Handler().postDelayed(new Runnable() {
			public void run() {
				for(int i=0; i<8; i++) {
					cardArr[i].cardImage.setImageResource(cardArr[i].faceImage);
				}
			}
		}, 1500);

		final Handler handler = new Handler();
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				handler.post(new Runnable() {
					@Override
					public void run() {	
						if(imageIndex==0) {
							gameReady.setVisibility(View.VISIBLE);
							gameSoundReadygo.start();
							imageIndex=1;
						} else if(imageIndex==1) {
							gameReady.setVisibility(View.INVISIBLE);
							gameStart.setVisibility(View.VISIBLE);
							imageIndex=2;
						} else if(imageIndex==2) {
							timerCard.cancel();
							gameStart.setVisibility(View.INVISIBLE);
							for(int i=0; i<8; i++) {
								cardArr[i].cardImage.setEnabled(true);	
							}
							drawback();
							timerStart();
							mediaPlayer.start();
						}
					}
				});
			}
		};
		timerCard.schedule(task, 3500, 1000);
	} // end of init()

	// 앞면 광고 문구를 보여준 후 뒷면을 그리기 위한 메소드
	public void drawback() {
		for (int i = 0; i < 8; i++) {
			cardArr[i].cardImage.setImageResource(R.drawable.event);
			textAd[i].setTextColor(Color.rgb(0, 144, 183));
		}
	}

	// 카드 앞면을 랜덤으로 섞기 위한 메소드 선언
	public void shuffle() {
		int adImage1 = R.drawable.ad1;
		for (int i = 0; i < 8; i++) {
			cardVector.add(adImage1 + i);
		}
		Collections.shuffle(cardVector);
	} // end of shuffle()

	// 카드 터치를 인식하고 카드 뒤집기 실행
	class CardHandler implements OnClickListener {
		@Override
		public void onClick(View v) {
			if (v.getId() == R.id.card_touch1) {
				cardAction(0);
			} else if (v.getId() == R.id.card_touch2) {
				cardAction(1);
			} else if (v.getId() == R.id.card_touch3) {
				cardAction(2);
			} else if (v.getId() == R.id.card_touch4) {
				cardAction(3);
			} else if (v.getId() == R.id.card_touch5) {
				cardAction(4);
			} else if (v.getId() == R.id.card_touch6) {
				cardAction(5);
			} else if (v.getId() == R.id.card_touch7) {
				cardAction(6);
			} else if (v.getId() == R.id.card_touch8) {
				cardAction(7);
			}
		}
	}// end of CardHandler Class

	// card 터치시 action 설정 메소드
	public void cardAction(int no) {
		cardArr[no].cardImage.setImageResource(cardArr[no].faceImage);
		gameSoundTok.start();
		if (cardArr[no].cardNo != seq) {
			new Handler().postDelayed(new Runnable() {
				public void run() {
					drawback();
				}
			}, 500);
			seq = 1;
		} else {
			textAd[seq - 1].setTextColor(Color.rgb(255, 100, 0));
			seq++;
		}
		if (seq > 8) {
			timerEnd();
			new Handler().postDelayed(new Runnable() {
				public void run() {
					Bundle extras = new Bundle();
					extras.putLong("result_time", outTime);
					extras.putString("gameName", "touchGame");
					extras.putString("userId", userId);
					startActivity((new Intent(TouchGame.this,GameScore.class).putExtras(extras)));										
					finish();
				}
			}, 1000);
		}
	} // end of cardAction()

	// timer를 시작하기 위한 메소드
	public void timerStart() {
		myBaseTime = SystemClock.elapsedRealtime();
		myTimer.sendEmptyMessage(0); // myTimer이라는 핸들러를 빈 메세지를 보내서 호출
	} // end of timerStart()

	// timer를 종료하기 위한 메소드
	public void timerEnd() {
		myTimer.removeMessages(0); // myTimer이라는 핸들러를 빈 메세지를 보내서 호출
	} // end of timerEnd()

	// timer 핸들러를 통해 시간 표시
	Handler myTimer = new Handler() {
		public void handleMessage(Message msg) {
			getTimeOut();
			myTimer.sendEmptyMessage(0);
		}
	};

	// 현재시간을 계속 구해서 출력하는 메소드
	public void getTimeOut() {
		outTime = SystemClock.elapsedRealtime() - myBaseTime; 								// 타이머 호출 시간과 get 메소드 호출시간을 차이를 통해 출력시간 표시
		timer.setText(String.format("%02d : %02d : %02d", outTime/1000/60, (outTime/1000)%60, (outTime%1000)/10));
	} // end of getTimeOut()

	@Override
	protected void onResume() {
		super.onResume();
		mediaPlayer = MediaPlayer.create(this, R.raw.touch_game);
		gameSoundReadygo = MediaPlayer.create(this, R.raw.readygo);
		gameSoundTok = MediaPlayer.create(this, R.raw.tok);
		mediaPlayer.setLooping(true);
	} // end of onResume()

	@Override
	protected void onPause() {
		super.onPause();
		mediaPlayer.stop();
		gameSoundReadygo.stop();
		gameSoundTok.stop();
	} // end of onPause()

	@Override
	protected void onDestroy() {
		super.onDestroy();
	} // end of onDestroy()

	@Override
	public void onBackPressed() { ; }
}; // end of class TouchGame